## This is a test case for --section-symbols, --section-relocations and
## --section-data command line flags and their aliases.

# RUN: yaml2obj %s -o %t

## Test --section-symbols (--st) displays symbols for each section.
# RUN: llvm-readobj --sections --st %t > %t.readobj-st
# RUN: llvm-readobj --sections --section-symbols %t > %t.readobj-st-no-alias
# RUN: diff %t.readobj-st %t.readobj-st-no-alias
# RUN: FileCheck %s --input-file=%t.readobj-st --check-prefixes=ALL,ST

## Test --section-relocations (--sr) displays relocations for each section.
# RUN: llvm-readobj --sections --sr %t > %t.readobj-sr
# RUN: llvm-readobj --sections --section-relocations %t > %t.readobj-sr-no-alias
# RUN: diff %t.readobj-sr %t.readobj-sr-no-alias
# RUN: FileCheck %s --input-file=%t.readobj-sr --check-prefixes=ALL,SR

## Test --section-data (--sd) displays section data for each section except SHT_NOBITS sections.
# RUN: llvm-readobj --sections --sd %t > %t.readobj-sd
# RUN: llvm-readobj --sections --section-data %t > %t.readobj-sd-no-alias
# RUN: diff %t.readobj-sd %t.readobj-sd-no-alias
# RUN: FileCheck %s --input-file=%t.readobj-sd --check-prefixes=ALL,SD

## Test all options together.
# RUN: llvm-readobj --sections --section-symbols --section-relocations --section-data %t | \
# RUN:   FileCheck %s --check-prefixes=ALL,ST,SR,SD

# ALL:      Sections [
# ALL-NEXT:   Section {
# ALL-NEXT:     Index: 0
# ALL-NEXT:     Name:  (0)
# ALL-NEXT:     Type: SHT_NULL (0x0)
# ALL-NEXT:     Flags [ (0x0)
# ALL-NEXT:     ]
# ALL-NEXT:     Address: 0x0
# ALL-NEXT:     Offset: 0x0
# ALL-NEXT:     Size: 0
# ALL-NEXT:     Link: 0
# ALL-NEXT:     Info: 0
# ALL-NEXT:     AddressAlignment: 0
# ALL-NEXT:     EntrySize: 0
# SR-NEXT:      Relocations [
# SR-NEXT:      ]
# ST-NEXT:      Symbols [
# ST-NEXT:      ]
# SD-NEXT:      SectionData (
# SD-NEXT:      )
# ALL-NEXT:   }
# ALL-NEXT:   Section {
# ALL-NEXT:     Index: 1
# ALL-NEXT:     Name: .text (6)
# ALL-NEXT:     Type: SHT_PROGBITS (0x1)
# ALL-NEXT:     Flags [ (0x0)
# ALL-NEXT:     ]
# ALL-NEXT:     Address: 0x0
# ALL-NEXT:     Offset: 0x40
# ALL-NEXT:     Size: 0
# ALL-NEXT:     Link: 0
# ALL-NEXT:     Info: 0
# ALL-NEXT:     AddressAlignment: 0
# ALL-NEXT:     EntrySize: 0
# SR-NEXT:      Relocations [
# SR-NEXT:      ]
# ST-NEXT:      Symbols [
# ST-NEXT:        Symbol {
# ST-NEXT:          Name: foo (1)
# ST-NEXT:          Value: 0x0
# ST-NEXT:          Size: 0
# ST-NEXT:          Binding: Local (0x0)
# ST-NEXT:          Type: None (0x0)
# ST-NEXT:          Other: 0
# ST-NEXT:          Section: .text (0x1)
# ST-NEXT:        }
# ST-NEXT:      ]
# SD-NEXT:      SectionData (
# SD-NEXT:      )
# ALL-NEXT:   }
# ALL-NEXT:   Section {
# ALL-NEXT:     Index: 2
# ALL-NEXT:     Name: .rela.text (1)
# ALL-NEXT:     Type: SHT_RELA (0x4)
# ALL-NEXT:     Flags [ (0x0)
# ALL-NEXT:     ]
# ALL-NEXT:     Address: 0x0
# ALL-NEXT:     Offset: 0x40
# ALL-NEXT:     Size: 24
# ALL-NEXT:     Link: 4
# ALL-NEXT:     Info: 1
# ALL-NEXT:     AddressAlignment: 0
# ALL-NEXT:     EntrySize: 24
# SR-NEXT:      Relocations [
# SR-NEXT:        0x0 R_X86_64_NONE - 0x0
# SR-NEXT:      ]
# ST-NEXT:      Symbols [
# ST-NEXT:      ]
# SD-NEXT:      SectionData (
# SD-NEXT:        0000: 00000000 00000000 00000000 00000000  |................|
# SD-NEXT:        0010: 00000000 00000000                    |........|
# SD-NEXT:      )
# ALL-NEXT:   }
# ALL-NEXT:   Section {
# ALL-NEXT:     Index: 3
# ALL-NEXT:     Name: .bss (12)
# ALL-NEXT:     Type: SHT_NOBITS (0x8)
# ALL-NEXT:     Flags [ (0x0)
# ALL-NEXT:     ]
# ALL-NEXT:     Address: 0x0
# ALL-NEXT:     Offset: 0x58
# ALL-NEXT:     Size: 4096
# ALL-NEXT:     Link: 0
# ALL-NEXT:     Info: 0
# ALL-NEXT:     AddressAlignment: 0
# ALL-NEXT:     EntrySize: 0
# SR-NEXT:      Relocations [
# SR-NEXT:      ]
# ST-NEXT:      Symbols [
# ST-NEXT:      ]
# ALL-NEXT:   }
# ALL-NEXT:   Section {
# ALL-NEXT:     Index: 4
# ALL-NEXT:     Name: .symtab (35)
# ALL-NEXT:     Type: SHT_SYMTAB (0x2)
# ALL-NEXT:     Flags [ (0x0)
# ALL-NEXT:     ]
# ALL-NEXT:     Address: 0x0
# ALL-NEXT:     Offset: 0x58
# ALL-NEXT:     Size: 48
# ALL-NEXT:     Link: 5
# ALL-NEXT:     Info: 2
# ALL-NEXT:     AddressAlignment: 8
# ALL-NEXT:     EntrySize: 24
# SR-NEXT:      Relocations [
# SR-NEXT:      ]
# ST-NEXT:      Symbols [
# ST-NEXT:      ]
# SD-NEXT:      SectionData (
# SD-NEXT:        0000: 00000000 00000000 00000000 00000000  |................|
# SD-NEXT:        0010: 00000000 00000000 01000000 00000100  |................|
# SD-NEXT:        0020: 00000000 00000000 00000000 00000000  |................|
# SD-NEXT:      )
# ALL-NEXT:   }
# ALL-NEXT:   Section {
# ALL-NEXT:     Index: 5
# ALL-NEXT:     Name: .strtab (27)
# ALL-NEXT:     Type: SHT_STRTAB (0x3)
# ALL-NEXT:     Flags [ (0x0)
# ALL-NEXT:     ]
# ALL-NEXT:     Address: 0x0
# ALL-NEXT:     Offset: 0x88
# ALL-NEXT:     Size: 5
# ALL-NEXT:     Link: 0
# ALL-NEXT:     Info: 0
# ALL-NEXT:     AddressAlignment: 1
# ALL-NEXT:     EntrySize: 0
# SR-NEXT:      Relocations [
# SR-NEXT:      ]
# ST-NEXT:      Symbols [
# ST-NEXT:      ]
# SD-NEXT:      SectionData (
# SD-NEXT:        0000: 00666F6F 00 |.foo.|
# SD-NEXT:      )
# ALL-NEXT:   }
# ALL-NEXT:   Section {
# ALL-NEXT:     Index: 6
# ALL-NEXT:     Name: .shstrtab (17)
# ALL-NEXT:     Type: SHT_STRTAB (0x3)
# ALL-NEXT:     Flags [ (0x0)
# ALL-NEXT:     ]
# ALL-NEXT:     Address: 0x0
# ALL-NEXT:     Offset: 0x8D
# ALL-NEXT:     Size: 43
# ALL-NEXT:     Link: 0
# ALL-NEXT:     Info: 0
# ALL-NEXT:     AddressAlignment: 1
# ALL-NEXT:     EntrySize: 0
# SR-NEXT:      Relocations [
# SR-NEXT:      ]
# ST-NEXT:      Symbols [
# ST-NEXT:      ]
# SD-NEXT:      SectionData (
# SD-NEXT:        0000: 002E7265 6C612E74 65787400 2E627373 |..rela.text..bss|
# SD-NEXT:        0010: 002E7368 73747274 6162002E 73747274 |..shstrtab..strt|
# SD-NEXT:        0020: 6162002E 73796D74 616200            |ab..symtab.|
# SD-NEXT:      )
# ALL-NEXT:   }
# ALL-NEXT: ]

## Check that --section-symbols, --section-relocations and --section-data
## options produce no output without --sections.
# RUN: llvm-readobj --section-symbols --section-relocations --section-data %t | \
# RUN:   FileCheck %s -DFILE=%t --check-prefix=NO-SECTIONS

# NO-SECTIONS:      File: [[FILE]]
# NO-SECTIONS-NEXT: Format: elf64-x86-64
# NO-SECTIONS-NEXT: Arch: x86_64
# NO-SECTIONS-NEXT: AddressSize: 64bit
# NO-SECTIONS-NEXT: LoadName: <Not found>
# NO-SECTIONS-NOT:  {{.}}

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_REL
  Machine: EM_X86_64
Sections:
  - Name: .text
    Type: SHT_PROGBITS
  - Name: .rela.text
    Type: SHT_RELA
    Info: .text
    Relocations:
      - Type: R_X86_64_NONE
  - Name: .bss
    Type: SHT_NOBITS
    Size: 0x1000
Symbols:
  - Name:    foo
    Section: .text

## Check the output for an arbitrary section when --section-symbols is requested,
## but there is no symbol table in the object.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: llvm-readobj -S --section-symbols %t2 2>&1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --check-prefix=NOSYMTAB

# NOSYMTAB:      Section {
# NOSYMTAB:        Index: 1
# NOSYMTAB-NEXT:   Name: .foo
# NOSYMTAB:        Symbols [
# NOSYMTAB-NEXT:   ]
# NOSYMTAB-NEXT: }
# NOSYMTAB-NEXT: Section {
# NOSYMTAB-NEXT:   Index: 2

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_REL
  Machine: EM_X86_64
Sections:
  - Name: .foo
    Type: SHT_PROGBITS
